package br.com.seuimovelnamao.hibernate;

import java.net.URLEncoder;
import java.text.Normalizer;
import java.util.List;

import br.com.seuimovelnamao.TipoPessoa;
import br.com.seuimovelnamao.Util;
import br.com.seuimovelnamao.dao.LocalizacaoDAO;
import br.com.seuimovelnamao.dao.PlanoDAO;
import br.com.seuimovelnamao.model.Bairro;
import br.com.seuimovelnamao.model.Cidade;
import br.com.seuimovelnamao.model.Estado;
import br.com.seuimovelnamao.model.Plano;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class PopulaTabelas {

	public static void main(String args[]){
		
		//Insere os planos para teste
		HibernateUtil hu = new HibernateUtil();
		PlanoDAO planoDAO = new PlanoDAO(hu.getSession());
		
		
		/*try {
			Plano p1 = new Plano();
			p1.setDescricao("Plano 1");
			p1.setTipoPessoa(TipoPessoa.PF);
			p1.setNome("Light");
			p1.setPreco((long) 39.90);
			p1.setQuantidadeImoveis(5);
			planoDAO.salva(p1);
			
			Plano p2 = new Plano();
			p2.setDescricao("Plano 2");
			p2.setTipoPessoa(TipoPessoa.PJ);
			p2.setNome("Premium");
			p2.setPreco((long) 79.90);
			p2.setQuantidadeImoveis(20);
			planoDAO.salva(p2);
			
			Plano p3 = new Plano();
			p3.setDescricao("Plano 3");
			p3.setTipoPessoa(TipoPessoa.PJ);
			p3.setNome("Platinum");
			p3.setPreco((long) 99.90);
			p3.setQuantidadeImoveis(50);
			planoDAO.salva(p3);
			
			hu.getSession().close();
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Planos criados");
		*/
		LocalizacaoDAO dao = new LocalizacaoDAO(hu.getSession());
		
		List<Estado> estados = dao.getEstados();
		/*
		try{
			for(Estado e : estados){
				List<Cidade> cidades = dao.getCidadesPorEstado(e);
				for(Cidade c : cidades){
					List<Bairro> bairros = dao.getBairrosPorCidade(c);
					for(Bairro b : bairros){
						b.setNomeURL(Util.getStringURL(b.getNome()));
						dao.atualiza(b);
					}
					c.setNomeURL(Util.getStringURL(c.getNome()));
					dao.atualiza(c);
				}
				e.setNomeURL(Util.getStringURL(e.getNome()));
				dao.atualiza(e);
				System.out.println(e.getUf() + " - populado");
			}
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		System.out.println("NomeURLs criadas");
		*/
		
		try {
			
			Util util = new Util();
			for(Estado e : estados){
				String json = util.excutePost("http://maps.googleapis.com/maps/api/geocode/json?address="+getStringURL(e.getNome())+",+brasil&sensor=false", "");
				 
				JSONObject my_obj = new JSONObject(json);
				
				String status = my_obj.getString("status");
				System.out.println(status);
				
				JSONArray results = my_obj.getJSONArray("results");
				
				JSONObject geometry = (JSONObject) results.getJSONObject(0).get("geometry");
				
				JSONObject location = (JSONObject) geometry.get("location");
				
				double lat = location.getDouble("lat");
				double lng = location.getDouble("lng");
				
				e.setLat(lat);
				e.setLng(lng);
				
				dao.atualiza(e);
				
				
				List<Cidade> cidades = dao.getCidadesPorEstado(e);
				
				for(Cidade c : cidades){
					if(c.getLat() == 0 && c.getLng() == 0){
						String jsonC = util.excutePost("http://maps.googleapis.com/maps/api/geocode/json?address="+getStringURL(c.getNome())+",+"+getStringURL(e.getNome())+"&sensor=false", "");
						 
						JSONObject my_objC = new JSONObject(jsonC);
						
						status = my_objC.getString("status");
						System.out.println(status);
						
						JSONArray resultsC = my_objC.getJSONArray("results");
						
						JSONObject geometryC = (JSONObject) resultsC.getJSONObject(0).get("geometry");
						
						JSONObject locationC = (JSONObject) geometryC.get("location");
						
						double latC = locationC.getDouble("lat");
						double lngC = locationC.getDouble("lng");
						
						c.setLat(latC);
						c.setLng(lngC);
						
						dao.atualiza(c);
					}
				}
				
				System.out.println("Estado " + e.getUf() + " e cidades atualizados");
				
			}
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
	}
	
	public static String getStringURL(String str){
		str = str.replaceAll(" ","+");  
		str = Normalizer.normalize(str, Normalizer.Form.NFD);  
		str = str.replaceAll("[^\\p{ASCII}]", "");  
	    return str.toLowerCase();
	}
}
